package org.example.springaop02.aspect;


import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

import java.util.Arrays;

/**
 * 环绕通知
 * 环绕通知可以修改目标方法的参数,还可以修改目标方法的返回结果
 * 还集成了(前置通知,正常返回通知,异常通知,后置通知)
 * 环绕通知的写法相对固定,就如下:
 */
@Component
@Aspect
public class AroundAspect {

    @Pointcut("execution(* org.example.springaop02..*(..))&&@annotation(org.example.springaop02.annotation.Tation)")
    public void joinPoint(){}


    //方法的固定写法
    @Around("joinPoint()")
    public Object aroundMethod(ProceedingJoinPoint proceedingJoinPoint) throws Throwable{

        //获取目标方法的参数
        Object[] args = proceedingJoinPoint.getArgs();

        System.out.println("------------环绕通知前置方法,参数:"+ Arrays.toString(args));
        Object proceed = null;


        try {
            //执行目标方法,并且拿到目标方法执行的返回结果
            proceed = proceedingJoinPoint.proceed(args);
            System.out.println("---------------环绕通知正常返回方法,返回结果:"+proceed);
        } catch (Throwable e) {
            System.out.println("----------------环绕通知异常通知,异常信息:"+e.getMessage());
            throw e;
        }
        System.out.println("-----------------环绕通知,后置方法");


        return proceed;
    }


}
